package model;

import java.util.LinkedList;
import java.util.Random;

import view.ObservadorMouse;
import view.VistaAvionLiviano;
import view.VistaAvionPesado;
import view.VistaHelicoptero;


import fiuba.algo3.titiritero.modelo.ObjetoVivo;

public class Juego implements ObjetoVivo,ObservadorMouse {
	
	TorreDeControl torreDeControl;
	Mapa mapa;
		
	
	public Juego () {
		
		this.torreDeControl = new TorreDeControl();
		this.mapa = Mapa.getMapa();
		// el juego debe empezar con una pista		
		this.agregarPista();
		
	}
	public TorreDeControl getTorreDeControl(){
		return this.torreDeControl;
	}
	public Mapa getMapa(){
		return this.mapa;
	}
	public void enviarNave(){
		
		
		 int numeroAleatorio = new Random().nextInt(4);
		//int numeroAleatorio = 3;
			 switch(numeroAleatorio){
		 case 0:
			 enviarAvionPesado();
			 break;
		 case 1:
			 enviarAvionSimple();
			 break;
		 case 2:
			 enviarHelicoptero();
			 break;
		 case 3:
			 enviarAvionComputarizado();
			 break;
		 }
		 
	}
	private void enviarAvionComputarizado(){
		AvionLiviano unaNave = new AvionLiviano();
		unaNave.addObserver(new VistaAvionLiviano(unaNave));
		this.mapa.agregarNave(unaNave);

		System.out.println("Se lanzo un AVION COMPUTARIZADO");
		unaNave.moverA(this.mapa.getRandomPista().getPosicionEntrada());

	}
	private void enviarAvionSimple(){
		AvionLiviano unaNave = new AvionLiviano();
		unaNave.addObserver(new VistaAvionLiviano(unaNave));
		System.out.println("Se lanzo un AVIONLIVIANO");
		this.mapa.agregarNave(unaNave);
	}
	private void enviarHelicoptero(){
		Helicoptero unaNave = new Helicoptero();
		unaNave.addObserver(new VistaHelicoptero(unaNave));
		System.out.println("Se lanzo un HELICOPTERO");
		this.mapa.agregarNave(unaNave);
	}
	private void enviarAvionPesado(){
		AvionPesado unaNave = new AvionPesado();
		unaNave.addObserver(new VistaAvionPesado(unaNave));
		System.out.println("Se lanzo un AVION PESADO");
		this.mapa.agregarNave(unaNave);
	}
	
	public void agregarPista(){
		int numeroAleatorio = new Random().nextInt(2);
		switch(numeroAleatorio){
			case 0:
				agregarPistaCorta();
				break;
			case 1:
				agregarPistaLarga();
				break;
	 }
	}

	private void agregarPistaLarga() {
		PistaLarga pista = new PistaLarga();
		mapa.agregarPista(pista);	
	}
	
	private void agregarPistaCorta() {
		PistaCorta pista = new PistaCorta();
		mapa.agregarPista(pista);
	}
	
	public boolean hayUnaPista() {
		
		return !(mapa.pistas.isEmpty());
	}

	public int cantidadDePistas() {
		
		return mapa.getCantidadDePistas();
	}
	
	public boolean hayNavesEnVuelo() {
		return this.torreDeControl.hayNavesEnVuelo();
	}
	
	public int cantidadDeNaves() {
		return this.mapa.getCantidadDeNaves();
	}
	
	//Para test
	public void agregarAvion(Nave unaNave){
		this.mapa.agregarNave(unaNave);
	}
	@Override
	public void vivir() {
		// TODO Auto-generated method stub
		this.torreDeControl.permitirAterrizajes();
		
		if (!this.torreDeControl.hayUnaColision()) {
			
			if (RandomInt.generarRandomEntre(1, 10) == 1) {
				this.enviarNave();		
			}
		} else {
			//TERMINAR EL JUEGO!
			System.out.println("HUBO UN CHOQUEEEEEEE!!!!!!!!");
		}
	}

/* Este metodo se invoca al hacer click en el mouse ya que Juego es un ObervadorMouse */
private void actualizarMovimientos(int posicionX, int posicionY){
	
	Posicion posicionParaAnalizar = new Posicion(posicionX,posicionY);
	LinkedList<Nave> naves = this.mapa.getNaves(); 
	for(Nave unaNave : naves){
		if(unaNave.estaSeleccionado()){
			System.out.println("Moviendo Nave");
			unaNave.moverA(posicionParaAnalizar);
			unaNave.desseleccionar();			
		}else
			if(unaNave.estaOcupandoPosicion(posicionParaAnalizar)){
				System.out.println("Seleccionando Nave ... " );
				unaNave.seleccionar();
			}
	}
}
@Override
public void notificarEvento(int posicionX, int posicionY) {
	// TODO Auto-generated method stub
	this.actualizarMovimientos(posicionX, posicionY);
	
}

}